package com.ycky.batchProcess;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

public interface BatchProcessStrategy<T, R> {

    @Data
    @AllArgsConstructor
    class PageResult<R> {
        private List<R> records;
        private String nextCursor;
    }

    /**
     * @description: 获取记录总数
     * @author: cjj
     * @date: 2025/3/18 14:33
     * @param: [code:业务code]
     **/
    default int getRecordCount(String code) {
        return getRecordCount(code, null);
    }

    /**
     * @description: 获取指定状态的记录数
     * @author: cjj
     * @date: 2025/3/18 14:34
     * @param: [code:数据标识, status:记录状态]
     **/
    int getRecordCount(String code, Integer status);

    /**
     * @description: 获取未发布记录总数
     * @author: cjj
     * @date: 2025/3/18 14:34
     * @param: [code:数据标识]
     **/
    int getUnpublishedCount(String code);

    /**
     * @description: 更新发布状态
     * @author: cjj
     * @date: 2025/3/18 14:46
     * @param: [code:数据标识]
     **/
    void updatePublishStatus(String code);

    /**
     * @description: 使用游标获取下一批记录，支持指定状态
     * @author: cjj
     * @date: 2025/3/18 14:45
     * @param: [code:数据标识，cursor:当前游标，pageSize:分页大小]
     **/
    PageResult<R> getNextBatch(String code, String cursor, int pageSize);

    /**
     * @description: 获取发布速率
     * @author: cjj
     * @date: 2025/3/18 15:11
     * @param: []
     **/
    int getPublishRate();

    /**
     * @description: 发布单条记录
     * @author: cjj
     * @date: 2025/3/18 15:14
     * @param: [data:发布的数据, record:未发布的记录, context:发布上下文]
     **/
    boolean publishRecord(R record, BatchProcessContext context);

    /**
     * @description: 推送进度信息
     * @author: cjj
     * @date: 2025/3/18 15:16
     * @param: [userId：用户ID, context:发布上下文, current:当前处理数量]
     **/
    void sendProgress(T userId, BatchProcessContext context, int current);

    /**
     * @description: 需要更新状态的记录
     * @author: cjj
     * @date: 2025/3/18 15:18
     * @param: [records:需要更新状态的记录]
     **/
    void batchUpdateStatus(List<R> records);
} 